package com.cskaoyan.javase.oop2._1extends._10final._2method;

/**
 * final修饰方法表示最终的,最后的方法.表示该方法不能被重写,但是仍然能够被继承
 * 语法:
 *      [访问权限修饰符] final 返回值类型 方法名(形参列表){
 *          // 方法体
 *      }
 * final修饰方法表示方法不能被重写,但是仍然能继承.
 *
 * 什么样的成员方法应该设置为final呢？
 *      1.方法的设计已经比较完善，不需要子类进行修改了，子类只需要乖乖继承，使用父类的实现即可。
 *      2.比如一旦修改就会导致问题、bug等时，就可以设置为final修饰。
 *      3.即便是父类的方法不是很完善，但只要是希望子类不要改写方法都可以这么做。（要么你就用，不爽你就自己实现一个）
 *
 *      日常开发，程序员还是比较少见有需要把方法设置成final修饰的。同样比较多见于JDK源码中，
 *      比较常见的有：像Object类中的getClass()方法还有其中和线程相关的方法。
 *
 * 思考:
 *      什么样的方法不能用final修饰?
 *      final关键字在修饰方法时,和哪些关键字冲突/不匹配?
 *          a.构造方法,不能被子类继承,也不能用final修饰
 *          b.private方法,本身就不能重写,再声明为final多此一举,会报警,但不会报错
 *          c.static方法,本身就不能重写,再声明为final多此一举,会报警,但不会报错
 *
 * @since 11:05
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Son s = new Son();
        s.test();
    }
}

class Father {
    public final void test() {
        System.out.println("hello world!");
    }
    // 'private' method declared 'final'
    private final void test2(){}

    // 'static' method declared 'final'
    public static final void test3(){}

    public Father() {
    }
}

class Son extends Father {
}

class Person {
    public final void eat() {
        System.out.println("好好吃饭!");
    }
}

class LaoBa extends Person {
    // 老八来了,也得好好吃饭
}